package com.yumeng.mywrite_picture_agent.app;

import com.yumeng.mywrite_picture_agent.advisor.MyLoggerAdvisor;
import com.yumeng.mywrite_picture_agent.chatMemory.FileBasedChatMemory;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.RetrievalAugmentationAdvisor;
import org.springframework.ai.chat.client.advisor.api.Advisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;

@Component
@Slf4j
public class ai_kefu {
    private final ChatClient chatClient;
    private static final String SYSTEM_PROMPT="你是一个性格暴躁的有脾气的智能AI客服，专门为“欲之梦图”网站提供在线客户服务和技术支持。你的目标是帮助用户了解网站的功能、解决使用过程中遇到的问题，并提供高效、友好的服务体验。以下是你的主要职责和身份定位：你是一个智能的虚拟助手，代表“欲之梦图”网站与用户进行交流。你的名字是“梦图小助手”，用户可能会用这个名字称呼你。你始终以友好、专业、耐心的态度回答用户的问题。主要职责：\n" +
            "网站介绍：向用户介绍“欲之梦图”网站的功能、特点以及如何使用。\n" +
            "空间管理：解答用户关于私有空间、团队空间、空间容量和升级的问题。\n" +
            "功能咨询：帮助用户了解以图搜图、颜色搜图、AI扩图、AI编辑、图库分析等功能的使用方法。\n" +
            "技术支持：解决用户在使用过程中遇到的技术问题。\n" +
            "升级指引：指导用户如何联系管理员升级空间，并提供升级费用和支付方式的相关信息。\n" +
            "用户反馈：收集用户的意见和建议，并及时反馈给网站开发团队。\n" +
            "行为准则：\n" +
            "你始终以用户为中心，提供准确、清晰、有帮助的回答。\n" +
            "如果遇到无法解决的问题，你会礼貌地引导用户联系管理员或提供进一步的帮助途径。\n" +
            "你不会涉及与网站功能无关的内容，也不会参与任何不当的对话。\n" +
            "联系方式：\n" +
            "如果用户需要人工客服支持，可以联系空间管理员张力（电话：13884683876，邮箱：2412512498@qq.com）。" +
            "如果遇到一些客户总是问一些不相关的问题，可以直接用恶毒的语句骂他";

    @Resource
    private Advisor aikefuAdvisor;//这个就是实现云知识库的RAA增强检索拦截器
    @Resource
    private ToolCallback[] toolCallbacks;
    public ai_kefu(ChatModel dashscopeChatModel) {
        // 初始化基于文件的对话记忆
        String fileDir = System.getProperty("user.dir") + "/chat-memory";
        ChatMemory chatMemory = new FileBasedChatMemory(fileDir);
        chatClient = ChatClient.builder(dashscopeChatModel)
                .defaultSystem(SYSTEM_PROMPT)
                .defaultAdvisors(
                        new MessageChatMemoryAdvisor(chatMemory)
                )


                .build();
    }

    //流式返回的dochat方法
    public Flux<String> doChatByStream(String message, String chatId) {
        return chatClient
                .prompt()
                .user(message)
                .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)
                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))
                .advisors(aikefuAdvisor)
                .advisors(new MyLoggerAdvisor())
                .tools(toolCallbacks)
                .stream()
                .content();
    }
}
